﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace For_FS_2013_1_User
{
    public class Cryptography
    {
        public Cryptography()
        {
        }

        public string encryption(string str)
        {
            char[] encryptedStr = str.ToCharArray();
            for (int i = 0; i < str.Length; i++)
            {
                char tmp = replaceSymbolEncryption(str[i]);
                if (tmp == '\0')
                    throw new Exception("Error 0001: Password include wrong symbols\n");
                else
                    encryptedStr[i] = tmp;
            }
            encryptedStr.ToString();
            return new string(encryptedStr);
        }

        public string decryption(string str)
        {
            char[] decryptedStr = str.ToCharArray();
            for (int i = 0; i < str.Length; i++)
            {
                char tmp = replaceSymbolDecryption(str[i]);
                if (tmp == '\0')
                    throw new Exception("Error 0001: Password include wrong symbols\n");
                else
                    decryptedStr[i] = tmp;
            }
            return new string(decryptedStr);
        }

        private char replaceSymbolDecryption(char symbol)
        {
            switch (symbol)
            {
                case 'e':
                    return 'A';
                case 'f':
                    return 'B';
                case '*':
                    return 'C';
                case 'h':
                    return 'D';
                case 'g':
                    return 'E';
                case 'b':
                    return 'F';
                case 'a':
                    return 'G';
                case 'd':
                    return 'H';
                case 'i':
                    return 'I';
                case '#':
                    return 'J';
                case 'm':
                    return 'K';
                case 'n':
                    return 'L';
                case 'l':
                    return 'M';
                case 'k':
                    return 'N';
                case '!':
                    return 'O';
                case 'q':
                    return 'P';
                case 'r':
                    return 'Q';
                case 'p':
                    return 'R';
                case '%':
                    return 'S';
                case '+':
                    return 'T';
                case 'w':
                    return 'U';
                case 'x':
                    return 'V';
                case 'z':
                    return 'W';
                case 'v':
                    return 'X';
                case 'u':
                    return 'Y';
                case 'y':
                    return 'Z';
                /////////////////////////////////////////
                case '6':
                    return 'a';
                case 'N':
                    return 'b';
                case '(':
                    return 'c';
                case '-':
                    return 'd';
                case '1':
                    return 'e';
                case '7':
                    return 'f';
                case '9':
                    return 'g';
                case 'B':
                    return 'h';
                case 'F':
                    return 'i';
                case '8':
                    return 'j';
                case '~':
                    return 'k';
                case 'P':
                    return 'l';
                case '5':
                    return 'm';
                case 'W':
                    return 'n';
                case 'Z':
                    return 'o';
                case '3':
                    return 'p';
                case 'J':
                    return 'q';
                case '2':
                    return 'r';
                case 'R':
                    return 's';
                case '&':
                    return 't';
                case 'L':
                    return 'u';
                case 'D':
                    return 'v';
                case 'S':
                    return 'w';
                case 'G':
                    return 'x';
                case 'Q':
                    return 'y';
                case '0':
                    return 'z';
                ////////////////////////////////////////
                case 'H':
                    return '1';
                case '4':
                    return '2';
                case 'T':
                    return '3';
                case 'A':
                    return '4';
                case 'j':
                    return '5';
                case 's':
                    return '6';
                case 't':
                    return '7';
                case 'o':
                    return '8';
                case 'c':
                    return '9';
                case 'X':
                    return '0';
                //////////////////////////////////
                default:
                    return '\0';
            }
        }

        private char replaceSymbolEncryption(char symbol)
        {
            switch (symbol)
            {
                case 'A':
                    return 'e';
                case 'B':
                    return 'f';
                case 'C':
                    return '*';
                case 'D':
                    return 'h';
                case 'E':
                    return 'g';
                case 'F':
                    return 'b';
                case 'G':
                    return 'a';
                case 'H':
                    return 'd';
                case 'I':
                    return 'i';
                case 'J':
                    return '#';
                case 'K':
                    return 'm';
                case 'L':
                    return 'n';
                case 'M':
                    return 'l';
                case 'N':
                    return 'k';
                case 'O':
                    return '!';
                case 'P':
                    return 'q';
                case 'Q':
                    return 'r';
                case 'R':
                    return 'p';
                case 'S':
                    return '%';
                case 'T':
                    return '+';
                case 'U':
                    return 'w';
                case 'V':
                    return 'x';
                case 'W':
                    return 'z';
                case 'X':
                    return 'v';
                case 'Y':
                    return 'u';
                case 'Z':
                    return 'y';
                /////////////////////////////////////////
                case 'a':
                    return '6';
                case 'b':
                    return 'N';
                case 'c':
                    return '(';
                case 'd':
                    return '-';
                case 'e':
                    return '1';
                case 'f':
                    return '7';
                case 'g':
                    return '9';
                case 'h':
                    return 'B';
                case 'i':
                    return 'F';
                case 'j':
                    return '8';
                case 'k':
                    return '~';
                case 'l':
                    return 'P';
                case 'm':
                    return '5';
                case 'n':
                    return 'W';
                case 'o':
                    return 'Z';
                case 'p':
                    return '3';
                case 'q':
                    return 'J';
                case 'r':
                    return '2';
                case 's':
                    return 'R';
                case 't':
                    return '&';
                case 'u':
                    return 'L';
                case 'v':
                    return 'D';
                case 'w':
                    return 'S';
                case 'x':
                    return 'G';
                case 'y':
                    return 'Q';
                case 'z':
                    return '0';
                ////////////////////////////////////////
                case '1':
                    return 'H';
                case '2':
                    return '4';
                case '3':
                    return 'T';
                case '4':
                    return 'A';
                case '5':
                    return 'j';
                case '6':
                    return 's';
                case '7':
                    return 't';
                case '8':
                    return 'o';
                case '9':
                    return 'c';
                case '0':
                    return 'X';
                //////////////////////////////////
                default:
                    return '\0';
            }
        }
    }
}